package com.airlines.crewassignment.service.linkline;

import java.util.Date;
import java.util.List;
import java.util.Set;

import com.airlines.base.service.base.BaseService;
import com.airlines.crewassignment.domain.FlightInfo;
import com.airlines.crewassignment.domain.LinkLine;
import com.airlines.crewassignment.entity.linkline.TaskLoopFlightFact;

/**
 * @author xxxx
 * @date 2018年6月20日 
 * @description
 */
public interface TaskLoopFlightFactService extends BaseService<TaskLoopFlightFact, Integer>{
	
	TaskLoopFlightFact getTaskLoopFlightFact(String dutyCode,int flightId);
	
	/**
	 * 根据某个航班，查询同一个机组连线的任务环信息，包括他自己
	 * @param dutyCode
	 * @param flightId
	 * @return
	 */
	List<TaskLoopFlightFact> listTaskLoopFlightFactByFlightId(String dutyCode, int flightId);

	/**
	 * 获取任务环集合
	 * @param loopList
	 * @return
	 */
	Set<String> getTaskLoopFactSet(List<TaskLoopFlightFact> loopList);
	
	/**
	 * 创建任务环实例
	 * @return
	 */
	String buildTaskLoopFact();

	/**
	 * 保存或者修改任务环实例
	 * @param dutyCode
	 * @param flightId
	 * @param taskLoopFact
	 * @return
	 */
	int saveOrUpdateTaskLoopFact(String dutyCode,Date flightDate, int flightId, String taskLoopFact);
	
	/**
	 * 根据某个连线，计算未来还可能需要的【飞行执勤期】
	 * 未来是指航班日期从第二天开始算起
	 * @param l
	 * @param endFlightDate
	 * @return
	 */
	int getRemainDutyDurationOfLoopPlan(LinkLine l, Date endFlightDate);

	/**
	 *根据某个连线，计算未来还可能需要的【飞行时间】
	 * 未来是指航班日期从第二天开始算起
	 * @param l
	 * @param endFlightDate
	 * @return
	 */
	int getRemainFlyDurationOfLoopPlan(LinkLine l, Date endFlightDate);
	
	/**
	 * 更新某个航班的过站休息时间
	 * @param flightId
	 * @return
	 */
	int updateRestTime(String dutyCode, int flightId,Integer restTime); 
	
	/**
	 * 将某一段时间范围内的航班自动组环，组连线
	 * @param flightDateStart
	 * @param flightDateEnd
	 */
	void autoTaskLoopFact(String dutyCode,Date flightDateStart,Date flightDateEnd,int[] taskLoopId);

	/**
	 * 标记某个航班为差航线
	 * @param dutyCode
	 * @param flightId
	 * @param badRoute
	 * @return
	 */
	int updateBadRoute(String dutyCode, Integer flightId, Boolean badRoute);

	/**
	 * 根据日期+连线，查询该连线对应的任务环实例信息
	 * @param dutyCode
	 * @param flightDate
	 * @param CrewLinkLine
	 * @return
	 */
	List<TaskLoopFlightFact> listTaskLoopFlightFactByCrewLinkLine(String dutyCode,
		Date flightDate,int crewLinkLine);
	
	/**
	 * 将一个航班列表，初始化所有的任务环信息
	 * @param list
	 * @return
	 */
	List<FlightInfo> flightInfoTaskLoopFlightFactListInit(String dutyCode,List<FlightInfo> list);
	
	/**
	 * 更新某个航线的男性最少人数
	 * @param dutyCode
	 * @param flightId
	 * @param minMale
	 * @return
	 */
	int updateMinMale(String dutyCode, Integer flightId, Integer minMale);

	/**
	 * 
	 * 更新某个航班为国际航班且差6时区以上
	 * @param dutyCode
	 * @param flightId
	 * @param internationalTimeZoneMore6
	 * @return
	 */
	int updateInternationalTimeZoneMore6(String dutyCode, Integer flightId, Boolean internationalTimeZoneMore6);

	int updateCrewTypeId(String dutyCode, Integer flightId, Integer crewType);
}
